/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sistema.de.fixture.auf.dominio;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

/**
 *
 * @author gabriel
 */
public class GestionSinEnchastres {

    private HashMap<Integer, Equipo> colEquipos;
    private HashMap<String, Fecha> colFechas;

    public GestionSinEnchastres() {
        this.colEquipos = new HashMap<Integer, Equipo>();
        Equipo eq;
        for (int i = 1; i <= 6; i++) {
            eq = new Equipo(i, "Equipo" + i);
            this.colEquipos.put(i, eq);
        }
        this.colFechas = new HashMap<String, Fecha>();
        //Aca va una llamada a un metodo de la clase Persistir
        //para cargar los equipos de colEquipos(quizas)
    }

    public boolean AltaEquipos(Equipo eq) {

        if (!this.colEquipos.containsValue(eq)) {

            this.colEquipos.put(eq.getNum(), eq);
            return true;
        }
        return false;
    }

    private boolean AltaFechas(Fecha objF) {
        if (!this.colFechas.containsValue(objF)) {

            this.colFechas.put(objF.getNombre(), objF);
            return true;
        }
        return false;
    }

    public HashMap<Integer, Equipo> devolverEquipos() {

        return this.colEquipos;

    }

    public void generarPartidosDelCampeonato() {
        ArrayList camp = new ArrayList();

        for (int n = 1; n < this.colEquipos.size(); n++) {
            for (int i = n + 1; i <= this.colEquipos.size(); i++) {
                Partido part = new Partido(this.colEquipos.get(n), this.colEquipos.get(i));
                camp.add(part);
            }
        }
        this.asignarFecha(camp, this.crearFechas());
        //return camp;
        //El algoritmo principal
    }

    private int crearFechas() {
        //El numero de fechas es la cantidad de partidos que juega cada equipo
        // El numero de equipos menos 1
        int nroFechas = this.colEquipos.size() - 1;
        //int nroFechas = this.colEquipos.size() / 2;
        for (int i = 1; i <= nroFechas; i++) {
            Fecha fecha = new Fecha(i);
            this.colFechas.put(fecha.getNombre(), fecha);
        }
        return nroFechas;
    }

    private void asignarFecha(ArrayList<Partido> campeonato, int nroFechas) {
/* Si en vez que las fechas conozcan a sus partidos, que los partidos conozcan
 * a las fechas. Dado que cada partido está en una fecha.
 */
        if (nroFechas <= 0) {
            return;
        } else {
            // Array auxiliar para ir quitando los partidos ya asignados
            ArrayList<Partido> campaux = (ArrayList<Partido>) campeonato.clone();

            for (; nroFechas > 0; nroFechas--) {
                Fecha objF = this.colFechas.get("Fecha " + nroFechas);//Por valor o por referencia??
                
                for (int i = 0; i < campeonato.size(); i++) {
                    //          Fecha objF = this.colFechas.get("Fecha " + nroFechas);//Por valor o por referencia??             
                    try {
                        if (!objF.esRepetido(campeonato.get(i))) {
                            //Mientras no se repiten partidos en la fecha
                            //siempre se mantendrá el numero correcto de partido por fecha
                            objF.agregarPartido(campaux.get(i));
                            campaux.remove(i);
                           
                        }
                    } catch (IndexOutOfBoundsException e) {

                        break;

                    }
                }
                this.colFechas.put(objF.getNombre(), objF);
                //this.asignarFecha(campeonato, --nroFechas);
            }
        }
    }

    public HashMap<String, Fecha> generarFixtureTrucho() {
        Equipo eq1 = new Equipo(1, "Nacional");
        Equipo eq2 = new Equipo(2, "Peñarol");
        Equipo eq3 = new Equipo(3, "Danubio");
        Equipo eq4 = new Equipo(4, "Defensor");
        this.colEquipos.put(1, eq1);
        this.colEquipos.put(2, eq2);
        this.colEquipos.put(3, eq3);
        this.colEquipos.put(4, eq4);

        Partido p1 = new Partido(eq1, eq2);
        Partido p2 = new Partido(eq3, eq4);

        Fecha f1 = new Fecha(1);
        f1.agregarPartido(p1);
        f1.agregarPartido(p2);
        Fecha f2 = new Fecha(2);
        f2.agregarPartido(p1);
        f1.agregarPartido(p2);

        this.colFechas.put(f1.getNombre(), f1);
        this.colFechas.put(f2.getNombre(), f2);

        return this.colFechas;
    }

    public HashMap<String, Fecha> getColFechas() {
        return colFechas;
    }
}
